from pyecharts import options as opts
from pyecharts.charts import Graph
import pandas as pd
import os
from pyecharts.charts import Bar, Grid, Line, Liquid, Page, Pie

print('软件名称：网络拓扑图生成工具\n'
      '软件版本：V1.1\n'
      '软件作者：赵晓健\n'
      '-------------------------')


def 关系图生成_单图(关系表完整路径):
    data = pd.read_excel(关系表完整路径, dtype='str')  # 读取网元关系表数据 定义文本格式为字符串
    df = pd.DataFrame(data).fillna('').astype('str')  # 定于数据为DataFrame 并替换nan值为空值 并将数字转换为字符串格式
    print(df)
    起点数据 = df.set_index('起点')  # 指定列
    起点列表 = 起点数据.index  # 读取列数据
    print('起点列表:', 起点列表)

    终点数据 = df.set_index('终点')  # 指定列
    终点列表 = 终点数据.index  # 读取列数据
    print('终点列表:', 终点列表)

    节点 = list(set(起点列表.append(终点列表)))  # 所有节点拼接并去重
    while '' in 节点:  # 删除节点中的空值
        节点.remove('')
    print('所有节点：', 节点)
    连接列表 = []
    for i in range(0, len(起点列表)):  # 组合连接点
        try:
            连接列表.append(起点列表[i] + '|' + 终点列表[i])
        except:
            print('数据异常跳过', 终点列表[i])
    print('所有连接关系:', 连接列表)

    节点列表 = []
    for i in 节点:  # 添加节点
        print('添加节点:', i)
        节点列表.append(opts.GraphNode(name=i, symbol_size=20))

    线 = []
    for i in 连接列表:  # 添加连接关系
        分割文本 = i.split('|')
        print('添加连接关系:', 分割文本[0], '-->', 分割文本[1])
        线.append(opts.GraphLink(source=分割文本[0], target=分割文本[1]))

    c = (
        Graph(init_opts=opts.InitOpts(width="2000px", height="900px"))
            .add("", 节点列表, 线, repulsion=10000)
            .set_global_opts(title_opts=opts.TitleOpts(title="网络拓扑图"))
            .render(路径 + "-单图.html")
    )
    input('-----------------------程序运行完毕-------------------------------------------\n'
          '文件保存在:' + 路径 + "-单图.html\n" + '按回车键打开拓扑图...\n')
    os.startfile(路径 + "-单图.html")


def 关系图生成_多图(关系表完整路径):
    data = pd.read_excel(关系表完整路径, dtype='str')  # 读取网元关系表数据 定义文本格式为字符串
    df = pd.DataFrame(data).fillna('').astype('str')  # 定于数据为DataFrame 并替换nan值为空值 并将数字转换为字符串格式
    # print(df)
    # 根据环名称将数据分组并转为多个DataFrame
    分组 = df.groupby('环名称')
    # print(分组)
    tmp = dict(list(分组))
    page = Page(layout=Page.SimplePageLayout)
    for x in tmp.keys():
        df = pd.DataFrame(tmp[x])
        print(df)
        起点数据 = df.set_index('起点')  # 指定列
        起点列表 = 起点数据.index  # 读取列数据
        print('起点列表:', 起点列表)

        终点数据 = df.set_index('终点')  # 指定列
        终点列表 = 终点数据.index  # 读取列数据
        print('终点列表:', 终点列表)

        节点 = list(set(起点列表.append(终点列表)))  # 所有节点拼接并去重
        while '' in 节点:  # 删除节点中的空值
            节点.remove('')
        print('所有节点：', 节点)
        连接列表 = []
        for i in range(0, len(起点列表)):  # 组合连接点
            try:
                连接列表.append(起点列表[i] + '|' + 终点列表[i])
            except:
                print('数据异常跳过', 终点列表[i])
        print('所有连接关系:', 连接列表)

        节点列表 = []
        for i in 节点:  # 添加节点
            print('添加节点:', i)
            节点列表.append(opts.GraphNode(name=i, symbol_size=20))

        线 = []
        for i in 连接列表:  # 添加连接关系
            分割文本 = i.split('|')
            print('添加连接关系:', 分割文本[0], '-->', 分割文本[1])
            线.append(opts.GraphLink(source=分割文本[0], target=分割文本[1]))
        c = (
            Graph(init_opts=opts.InitOpts(width="2000px", height="900px"))
                .add("", 节点列表, 线, repulsion=4000)
                .set_global_opts(title_opts=opts.TitleOpts(title=x))
        )
        page.add(
            c,
        )
    page.render(路径 + "-多图.html")
    input('-----------------------程序运行完毕-------------------------------------------\n'
          '文件保存在:' + 路径 + "-多图.html\n" + '按回车键打开拓扑图...\n')
    os.startfile(路径 + "-多图.html")


while True:
    模式 = input(
        '1：单图模式\t'
        '2：多图模式\n'
        '请输入对应数字选择拓扑图模式：\n')
    if 模式 == '1':
        print('您选择了模式', 模式)
        路径 = input('请输入网元连接关系表完整路径,按回车键继续:')
        关系图生成_单图(路径)
    if 模式 == '2':
        print('您选择了模式', 模式)
        路径 = input('请输入网元连接关系表完整路径,按回车键继续:')
        关系图生成_多图(路径)
    if 模式 == '1' or 模式 == '2':
        break
